<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<script>

// 箭头函数
// 语法：(形参)=>{函数体}
// let f1 = ()=>{}
// let f2 = a =>{}
// let f3 = () =>console.log( 123 );
// let f4 = a => a;

// 箭头函数和普通函数的区别：
// 1.箭头函数没有函数声明的形式
// 2.箭头函数内部没有自己的this，使用函数外部的this
// 3.箭头函数内部的this不能修改指向
// 4.箭头函数不能使用new调用（不能作为构造函数）
// 5.箭头函数没有prototype属性
// 6.箭头函数内部没有arguments对象

// 模板字符串
// 模板字符串使用反引号``表示
// 模板字符串内部可以使用回车换行，使用${变量名}插入变量的值

// 解构赋值
// 解构赋值就是解析数据结构并对变量进行赋值
// 1.将右边的数组解构赋值给左边的变量
// 2.将右边的对象解构赋值给左边的变量
// 3.将实参（数组和对象）解构赋值给形参

// 设置默认值
// 1.给形参设置默认值
// function fn1(a=1,b=1){}
// 2.解构赋值时给变量设置默认值
// let [a=1,b=1] = [1,2,3];

// function fn2({a=1,b=1}={}){}
// fn2();

// includes()判断数组或字符串中是否包含某个值
// startsWith()判断字符串开头是否为某个字符
// endsWith()判断字符串结尾是否为某个字符
// flat()将多维数组扁平化
// find()返回数组中第一个符合条件的元素
// findIndex()返回数组中第一个符合条件的元素的下标
// fill()使用某个值填充数组
// Array.from()将含有length属性并且以数字为key的对象转为真正的数字
// isArray(a)判断某个值是否为数组

// 三个点
// 1.展开运算符... 将数据展开为逗号隔开的参数序列 a,b,c,d
// console.log( ...arr );
// console.log( ...str );
// 2.rest运算符... 收集剩余的值
// let [a,b,...c] = [1,2,3,4,5,6];
// function fn3(...arr){}
// fn3(1,2);
// fn3(1,2,3,4);

// Generator函数
// Generator是迭代器生成函数（执行后返回一个迭代器对象）
// Generator函数使用*号表示，内部使用yield产出一个值
// function * fn4(){
//     yield 123;
//     yield 456;
//     yield 789;
// }
// let res = fn4();// res迭代器对象
// res.next();会执行到函数中的yield，然后继续暂停

// 字符串、数组、类数组对象、Map对象、Set对象原型上有一个属性Symbol.iterator，属性的值为一个Generator函数
// let arr = [1,2,3];
// arr[Symbol.iterator] -> Generator函数

</script>
</body>
</html>